import java.util.Stack;

public class ReversePolishNotationEvaluator {

    // 计算逆波兰表达式的主方法
    public int evaluateRPN(String[] tokens) {
        // 参数tokens是一个字符串数组，包含逆波兰表达式的各个组成部分（数字或运算符）
        // 创建一个操作数栈，用于存储数字
        Stack<Integer> operandStack = new Stack<>();

        // 遍历输入的所有token（可以是数字或运算符）
        for (String token : tokens) {
            // 检查当前token是否是运算符
            if (!isOperator(token)) {
                // 如果是数字，将其字符串形式转换为整数并压入栈中
                operandStack.push(Integer.parseInt(token));
            } else {
                // 如果是运算符，弹出栈顶两个元素
                // 注意顺序：因为栈是后进先出，先弹出的是第二个操作数，后弹出的是第一个操作数
                int secondOperand = operandStack.pop();
                int firstOperand = operandStack.pop();

                // 根据运算符类型执行相应计算
                switch (token) {
                    case "+":
                        operandStack.push(firstOperand + secondOperand);
                        break;
                    case "-":
                        operandStack.push(firstOperand - secondOperand);
                        break;
                    case "*":
                        operandStack.push(firstOperand * secondOperand);
                        break;
                    case "/":
                        operandStack.push(firstOperand / secondOperand);
                        break;
                }
            }
        }
        // 当所有token处理完毕后，栈中应只剩下一个元素
        // 最后栈中剩下的唯一元素就是计算结果，将其弹出并返回
        return operandStack.pop();
    }

    // 辅助方法：判断一个字符串是否是运算符
    // 参数token是要检查的字符串
    // 返回true表示是运算符（"+", "-", "*", "/"之一），false表示不是
    private boolean isOperator(String token) {
        return token.equals("+") || token.equals("-")
                || token.equals("*") || token.equals("/");
    }
}